/**
 * 编辑页插件
 * last update time 2016-01-17
 * 描述：适用于简单编辑页面
 * 功能：1.根据参数判断是编辑页还是添加页，并实现自动对页面控件进行复制，
 *       2.默认添加返回，提交按钮事件
 * 实例：查看下方注释
 */
var ModifyPlugin = (function () {
    "use strict";

    // 默认参数
    var defaults = {
        // id
        id: '',
        // 添加还是编辑
        isAdd: true,
        //  处理程序url
        handlerUrl: '',
        // 获取详情额外参数
        viewParams: {},
        // 提交数据额外参数
        submitParams: {},
        // 返回页面url
        returnPageUrl: '',
        // 输入控件
        pageControls: [],
        // 表单控件
        formControl: '#myForm',
        // 提交按钮
        btnSubmit: '#btnSubmit',
        // 返回按钮
        btnReturn: '#btnReturn',
        // 表单提交其他验证
        formValidationOthers: function (self) {
            return true;
        }
    };

    // 获取数据
    var getData = function (self) {
        var settings = self.settings,
            handlerUrl = settings.handlerUrl,
            params = settings.viewParams;
        return $.ajax({
            url: handlerUrl,
            type: "post",
            data: params,
            dataType: "json"
        });
    };

    // 渲染页面
    var render = function (result, self) {
        try {
            if (!result.errMsg) {
                var pageControls = self.settings.pageControls;
                $.each(pageControls, function (index, item) {
                    var element = $(item.controlID),
                        value = result[item.controlID.toString().replace('#', '')];
                    if (item.reset) {
                        //item.reset(element, value);
                        element.val(item.reset(element, value));
                    } else {
                        element.val(value);
                    }
                });
            }
        } catch (error) {
            console.log(error);
        }
    };

    // 提交验证 必须输入
    var formValidationRequired = function (self) {
        var pageControls = self.settings.pageControls,
            boolValided = true,
            i = pageControls.length - 1;
        for (i; i >= 0; i--) {
            var control = pageControls[i],
                element = $(control.controlID);
            if (control.requiredMsg && !element.val()) {
                // 弹出消息
                myUtil.showError(element, control.requiredMsg);
                // 返回结果
                boolValided = false;
                break;
            }
        }

        return boolValided;
    };

    // 提交数据
    var submitData = function (settings) {
        var handlerUrl = settings.handlerUrl,
            params = $.param(settings.submitParams) + '&&' + $(settings.formControl).serialize();
        return $.ajax({
            url: handlerUrl,
            type: "post",
            data: params,
            dataType: "json"
        });
    };

    // 提交数据反馈
    var submitResponse = function (settings, result) {
        var returnPageUrl = settings.returnPageUrl;
        if (result.errMsg) {
            toastr.warning(result.errMsg);
        } else {
            toastr.success("数据提交成功");
            // 跳转到列表页面
            window.self.location.href = returnPageUrl;
        }
    };

    // 设置等待显示（按钮不可用，显示loading动画）
    var blockWating = function (settings) {
        // 所有按钮不可用
        $(settings.btnSubmit).attr('disabled', 'disabledd');
        // 提交按钮显示loading动画
        myUtil.blockUI({
            target: settings.formControl,
            message: '加载中，请稍等...'
        });
    };

    // 取消等待显示
    var unBlockWating = function (settings) {
        // 所有按钮不可用
        $(settings.btnSubmit).removeAttr('disabled');
        // 提交按钮显示loading动画
        myUtil.unblockUI(settings.formControl);
    };

    // 构造函数
    function ModifyPlugin(options) {
        this.settings = $.extend({}, defaults, options);
    }

    // 初始化
    ModifyPlugin.prototype.init = function () {
        this.showData();
        this.bindClickEvent();
        this.bindOtherEvent();
        return this;
    };

    // 绑定数据
    ModifyPlugin.prototype.showData = function () {
        var self = this,
            settings = self.settings;
        if (settings.id) {
            // 展示等待画面
            blockWating(settings);
            // 数据获取完后渲染画面，同时取消等待画面
            $.when(getData(self)).done(function (data) {
                render(data, self);
            }).fail(function () {
                toastr.warning('数据获取失败！');
            }).always(function () {
                unBlockWating(settings);
            });
        }
    };

    // 绑定点击事件
    ModifyPlugin.prototype.bindClickEvent = function () {
        var self = this,
            settings = self.settings;
        // 提交按钮事件
        $(settings.btnSubmit).on('click', function () {
            if (formValidationRequired(self) && settings.formValidationOthers(self)) {
                // 展示等待画面
                blockWating(settings);
                // 数据获取完后渲染画面，同时取消等待画面
                $.when(submitData(settings)).done(function (data) {
                    submitResponse(settings, data);
                }).fail(function () {
                    toastr.warning('数据提交失败！');
                }).always(function () {
                    unBlockWating(settings);
                });
            }
        });

        // 返回按钮事件
        $(settings.btnReturn).on('click', function () {
            window.self.location.href = settings.returnPageUrl;
        });
    };

    // 绑定其他事件
    ModifyPlugin.prototype.bindOtherEvent = function () {
        // 日期
        $(".form_datetime").datepicker({
            format: "yyyy-mm-dd",
            todayBtn: "linked",
            clearBtn: true,
            language: "zh-CN",
            autoclose: true,
            todayHighlight: true,
            toggleActive: true
        });

        // 最大长度
        $('.input_maxlength').maxlength({
            limitReachedClass: "label label-danger",
            alwaysShow: true
        });
    };

    // 返回构造函数
    return ModifyPlugin;
})();